Skip to main content

APIView 视图扩展

除了支持序列化以外,Django REST Framework(以下简称 DRF)还提供了对视图的扩展。在我们的 movie/views.py 文件中,我们依然可以使用 DRF 提供的 APIView 来实现对视图的扩展,更好地为接口服务。例如,在访问名为 api/movie 的时候,我们可以使用不同的请求方式,如 getpostdelete 等。如下图所示:

01访问apimovie

在movie/views.py文件中的requests,默认情况下它使用的是 get 请求。如下图所示:

02request.jpg

接下来,我们将通过一个例子演示如何使用 DRF 提供的视图扩展来实现不同的请求方式,以最常用的 getpost 请求为例。我们先在dx_movie/movie/views.py文件中需要从 DRF 中导入 APIView 类。在使用该函数时,我们以装饰器的方式进行使用。在介绍函数的时候,装饰器使用 @ 符号,然后添加上装饰器函数。这个函数中,我们可以传递参数,即请求的方式是 getpost,我们将它们作为一个列表传递给装饰器。接下来,我们根据请求方式进行判断。对于 get 请求,我们重写它以判断请求的方式是否为 get,然后执行相应的操作。在返回时,我们希望返回 JSON 数据,并添加一个状态码,表示请求的状态。通常情况下,状态码 200 表示请求成功,而 404 表示未找到。因此,我们使用 DRF 提供的 response 模块来返回响应,其中包含了状态码 200 OK。修改代码如下:

# 从Django中导入render函数
from django.shortcuts import render
# 从Django中导入JsonResponse类
from django.http import JsonResponse
# 从rest_framework.decorators模块中导入@api_view装饰器
from rest_framework.decorators import api_view
# 从rest_framework模块中导入status常量和Response类
from rest_framework import status
from rest_framework.response import Response
# 从当前目录下导入Movie模型和MovieListSerializer序列化器
from .models import Movie
from .serializers import MovieListSerializer

# 定义电影列表视图
@api_view(['GET', 'POST'])
def movie_list(request):
# 如果请求方法为GET
if request.method == 'GET':
# 获取所有电影数据
movies = Movie.objects.all()
# 使用MovieListSerializer对电影数据进行序列化
serializer = MovieListSerializer(movies, many=True)
# 返回序列化后的数据和状态码200 OK
return Response(serializer.data, status=status.HTTP_200_OK)

通过上述改造,我们实现了 get 请求,并可以在请求接口时得到一个状态码为 200 的 JSON 格式数据。如下图所示:

03get方法页面数据

如果我们想要看json格式的数据我们可以点击页面右上角的json按钮来进行切换,如下图所示:

04json格式

接下来,我们来实现 post 请求。同样地,我们根据请求方式进行判断,如果是 post 请求,则进行表单的提交。首先,我们需要获取表单提交的数据,然后对数据进行序列化。我们使用 DRF 提供的 serializer 类来实例化,并传递表单提交的对象。然后,我们判断表单是否验证成功,如果验证成功则保存用户提交的数据,并返回相应信息;如果验证失败,则返回错误信息。修改代码如下:

# 从Django中导入render函数
from django.shortcuts import render
# 从Django中导入JsonResponse类
from django.http import JsonResponse
# 从rest_framework.decorators模块中导入@api_view装饰器
from rest_framework.decorators import api_view
# 从rest_framework模块中导入status常量和Response类
from rest_framework import status
from rest_framework.response import Response
# 从当前目录下导入Movie模型和MovieListSerializer序列化器
from .models import Movie
from .serializers import MovieListSerializer

# 定义电影列表视图
@api_view(['GET', 'POST'])
def movie_list(request):
# 如果请求方法为GET
if request.method == 'GET':
# 获取所有电影数据
movies = Movie.objects.all()
# 使用MovieListSerializer对电影数据进行序列化
serializer = MovieListSerializer(movies, many=True)
# 返回序列化后的数据和状态码200 OK
return Response(serializer.data, status=status.HTTP_200_OK)
elif request. method == 'POST':
serializer = MovieListSerializer (data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status HTTP_400_BAD_REQUEST)

至此,我们已经完成了对post请求的逻辑处理。下一步,我们将介绍如何使用 Postman 这一接口测试开发工具来发送各种请求。